﻿# -*- coding: utf-8 -*-
'''
内容格式：手机号、姓名、余额、上次充值、上次消费、赠送金额、累计充值、累计消费、累计赠送、充值积分、目前积分
会员设置格式：充值多少、赠送多少、几元1积分
'''
from tkinter import *

# 密码窗口
root0 = Tk()
root0.title('请登录')
root0.geometry('300x200+450+150')
v1 = StringVar()
Label(root0, textvariable=v1, font=('Arial', 12), width=20, height=1).pack()

# 查找有没有积分设置
try:
    with open('fl.txt', encoding='utf8') as f:
        fl = f.read()
    l = fl.split()
    l = list(map(int, l))
    cz11, zs11, jf11 = l[0], l[1], l[2]
except:
    fl = '99999 0 99999'
    with open('fl.txt', 'w', encoding='utf8') as f:
        f.write(fl)

# 判断是不是第一次登录
try:
    with open('mm.txt', encoding='utf8') as f:
        mm = f.read()
    Label(root0, text="在此输入密码：").place(x=10, y=30)
    # tkinter里的string变量用来存储Entry里的textvariable
    e1 = Entry(root0, show="*")  # show里可以是别的符号
    e1.place(x=120, y=30)
    z = 0
except:
    Label(root0, text="请输入新密码：").place(x=10, y=60)
    Label(root0, text="再次输入密码：").place(x=10, y=90)
    e2 = Entry(root0, show="*")  # show里可以是别的符号
    e2.place(x=120, y=60)
    e3 = Entry(root0, show="*")  # show里可以是别的符号
    e3.place(x=120, y=90)
    z = 1

def 会员设置():
    hysz = Toplevel()
    hysz.title('设置会员福利')
    hysz.geometry('400x300+450+100')
    # 添加标签
    Label(hysz, text="充值多少：", font=('Arial', 12)).place(x=30, y=50)
    Label(hysz, text="赠送多少：", font=('Arial', 12)).place(x=30, y=100)
    Label(hysz, text="几元1积分：", font=('Arial', 12)).place(x=30, y=150)

    v11 = StringVar()  # 将label标签的内容设置为字符类型，用var来接收函数的传出内容用以显示在标签上
    Label(hysz, textvariable=v11, font=('Arial', 15), width=50, height=1).pack()
    v11.set(f'充值{cz11}元赠送{zs11}元，每{jf11}元1积分')
    # 添加输入框
    cz = Entry(hysz, font=('Arial', 12))
    cz.insert(0, 99999)
    cz.place(x=150, y=50)
    zs = Entry(hysz, font=('Arial', 12))
    zs.insert(0, 0)
    zs.place(x=150, y=100)
    jf1 = Entry(hysz, font=('Arial', 12))
    jf1.insert(0, 99999)
    jf1.place(x=150, y=150)
    def she_zhi():
        from tkinter import messagebox
        if (cz.get()).isdigit() and (zs.get()).isdigit() and (jf1.get()).isdigit():
            l11 = [cz.get(), zs.get(), jf1.get()]
            fl = ' '.join(l11)
            with open('fl.txt', 'w', encoding='utf8') as f:
                f.write(fl)
            v11.set('')
            v11.set('保存成功！重启软件生效！')
            messagebox.showinfo(title='重要提示！！！', message='保存成功！重启软件才能生效！！！')
        else:
            v11.set('请输入整数')

    设置按钮1 = Button(hysz, text="确定保存", width=10, command=she_zhi)
    设置按钮1.place(x=100, y=200)

def 会员福利(充值金额, cz11, zs11, jf11):
    赠送金额 = 积分 = 0
    if 充值金额 > 9:
        积分 = 充值金额 // jf11
    if 充值金额 >= cz11:
        赠送金额 = 充值金额 // cz11 * zs11
    return 赠送金额, 积分

def 获取会员():
    hui_yuan = {}
    try:
        with open('子时会员.txt', encoding='utf8') as f:
            a = f.readlines()
            # print(f'a==={a}')
    except:
        return hui_yuan
    for i in a:  # 遍历文件内容
        n = 1
        # print(f'n====={n}')
        lst = i.split()  # 按行形成列表并去除换行符
        for j in lst[2:]:  # 把字符转换成数字
            n += 1
            lst[n] = float(j)
        hui_yuan[lst[0]] = lst[1:]  # 转换后加入字典
    return hui_yuan

hy = 获取会员()
# print(f'hy======{hy}')
def 输出排版():
    b, x = '', 0
    if hy:
        for i in hy:
            x += 1
            a = f'  ({x})  {i}：\t姓名：{hy[i][0]}\t\t\t剩余：{hy[i][1]}元\n\
                            \t\t上次充值：{hy[i][2]}元\t\t上次消费：{hy[i][3]}元\n\
                            \t\t累计充值：{hy[i][5]}元\t\t累计消费：{hy[i][6]}元\n'
            b = b + a
    else:
        b = '目前没有会员！'
    return b

def 输出2(di):
    for i in di:
        a = f'会员：{i}\n\
        姓名：{di[i][0]}--------剩余：{di[i][1]}元，\n\
        上次充值：{di[i][2]}元---上次消费：{di[i][3]}元\n\
        累计充值：{di[i][5]}元---累计消费：{di[i][6]}元\n'
    return a

def 保存(hy):
    l = []
    for i in hy:
        l.append(i)
        for j in hy[i]:
            l.append(f' \t{str(j)}')
        l.append('\n')
    # 开始写入文件
    with open('子时会员.txt', 'w', encoding='utf8') as f:
        f.writelines(l)

def 查看():
        # 设置新窗口
        root3 = Toplevel()
        root3.title('查看会员')
        root3.geometry('600x600+450+100')
        # 设置文本框内容
        txt = 输出排版()
        # 创建文本框text，设置宽度100，high不是高度，是文本显示的行数设置为3行
        text = Text(root3, bg='Chartreuse', font=('Arial', 12), width=80, height=25)
        # 创建滚动条
        scroll = Scrollbar()
        # 将滚动条与文本框关联
        scroll.config(command=text.yview)  # 将文本框关联到滚动条上，滚动条滑动，文本框跟随滑动
        text.config(yscrollcommand=scroll.set)  # 将滚动条关联到文本框
        # 将文本内容插入文本框
        text.insert('insert', txt)

        # scroll.pack(side=RIGHT, fill=Y)  # side是滚动条放置的位置，上下左右。fill是将滚动条沿着y轴填充
        text.place(x=0, y=10)  # 将文本框填充进root窗口的左侧，

def 查找():
    global hy
    # 设置新窗口
    root1 = Toplevel()
    root1.title('查找会员')
    root1.geometry('600x400+450+300')

    # 在图形界面上设定标签
    var1 = StringVar()  # 将label标签的内容设置为字符类型，用var来接收函数的传出内容用以显示在标签上
    Label(root1, textvariable=var1, font=('Arial', 12), width=60, height=6).place(x=0, y=100)

    if len(hy) > 0:
        # 绘制个label,grid（）确定行列
        Label(root1, text="请输入电话后四位或更多：", font=('Arial', 12)).pack()
        cz = Label(root1, text="充值：", font=('Arial', 12))
        xf = Label(root1, text="消费：", font=('Arial', 12))
        # jf = Label(root1, text="积分消费：", font=('Arial', 12))

        # 导入输入框
        e11 = Entry(root1, font=('Arial', 12))
        cz1 = Entry(root1, font=('Arial', 12), width=6)
        cz1.insert(0, 0)
        xf1 = Entry(root1, font=('Arial', 12), width=6)
        xf1.insert(0, 0)
        jf1 = Entry(root1, font=('Arial', 12), width=6)
        jf1.insert(0, 0)

        # 设置输入框的位置
        e11.pack()
    else:
        var1.set('')
        var1.set('没有会员!')

    def show():
        di = {}  # 创建临时字典
        ans1 = str(e11.get())
        if ans1.isdigit():  # 检查是否是数字
            for i in hy:  # 遍历会员信息
                if ans1 in i[11 - len(ans1):]:  # 电话后几位相同
                    di[i] = hy[i]
            if di:
                if len(di) > 1:
                    var1.set('')
                    var1.set('搜索到多个会员\n（重新输入电话号码，多输入几位以便精确查找）!')
                else:
                    a = 输出2(di)
                    var1.set('')
                    var1.set(f'{a}')
                    cz.place(x=30, y=300)
                    cz1.place(x=80, y=300)
                    xf.place(x=150, y=300)
                    xf1.place(x=200, y=300)
                    # jf.place(x=270, y=300)
                    # jf1.place(x=370, y=300)
                    保存按钮.place(x=450, y=290)
                    return di
            else:
                var1.set('')
                var1.set('无此会员!')
        else:
            var1.set('')
            var1.set('输入错误！！！请输入电话号码!')

    # 清除函数，清除输入框的内容
    def dele():
        e11.delete(0, END)

    # 建立充值消费函数
    def 金额():
        global hy
        try:
            # 导出会员原始数据
            di = show()

            # x是充值金额，y是消费金额，z是积分消费
            x, y, z = int(cz1.get()), int(xf1.get()), int(jf1.get())
            y = y * 0.85

            # e是赠送金额，f是积分（0姓名、1余额、2上次充值、3上次消费、4赠送金额、5累计充值、6累计消费、7累计赠送、8积分、9积分消费）
            e, f = 会员福利(x, cz11, zs11, jf11)
        except:
            var1.set('')
            var1.set('输入错误！！！请输入整数！！！')

        # a是累计充值，b是累计消费， c是累计赠送
        for i in di:  # 读取会员信息
            l = di[i][1:]  # 切片金额内容
        # 0余额、1上次充值(x)、2上次消费(y)、3赠送金额(e)、4累计充值(a)、5累计消费(b)、6累计赠送(c)、7充值积分(f)、8目前积分(d)
        a, b, c, d, l[3] = l[4], l[5], l[6], l[8], e
        b = f'{(b+y):.2f}'
        l[1], l[2], a, c, d = x, y, a + x, c + e, d + f - z
        l[4], l[5], l[6], l[7], l[8] = a, b, c, f, d
        l[0] = f'{(a + c - float(b)):.1f}'
        print(l[0])
        l.insert(0, di[i][0])  # 名字加入列表
        di[i] = l
        for i in di:
            a = f'会员：{i}\n\
            姓名：{di[i][0]}--------剩余：{di[i][1]}元，\n\
            本次充值：{di[i][2]}元---本次消费：{di[i][3]}元\n\
            累计充值：{di[i][5]}元---累计消费：{di[i][6]}元\n'
        var1.set('')
        var1.set(f'{a}')
        # 开始写入
        hy[i] = l
        保存(hy)

        # 把输入清零，防止出现重复输入
        cz1.delete(0, END)
        xf1.delete(0, END)
        jf1.delete(0, END)
        cz1.insert(0, 0)
        xf1.insert(0, 0)
        jf1.insert(0, 0)

    # 设置按钮，点击按钮执行命令 command= 命令函数
    确定按钮 = Button(root1, text="确定", width=8, command=show)
    清除按钮 = Button(root1, text="清除", width=8, command=dele)
    保存按钮 = Button(root1, text="确定保存", width=10, command=金额)

    if len(hy) > 0:
        # 设置按钮的位置行列及大小
        确定按钮.place(x='215', y='50')
        清除按钮.place(x='310', y='50')

def 添加():
    global hy, root
    # 设置新窗口
    root2 = Toplevel()
    root2.title('添加会员')
    root2.geometry('600x400+450+300')
    Label(root2, text='添加新会员', bg='chocolate', font=('Arial', 25)).pack()

    # 添加标签
    Label(root2, text="手机号：", font=('Arial', 12)).place(x=30, y=100)
    Label(root2, text="姓名：", font=('Arial', 12)).place(x=30, y=150)
    Label(root2, text="充值：", font=('Arial', 12)).place(x=30, y=200)
    Label(root2, text="消费：", font=('Arial', 12)).place(x=30, y=250)

    # 添加输入框
    dh2 = Entry(root2, font=('Arial', 12))
    dh2.place(x=100, y=100)
    xm2 = Entry(root2, font=('Arial', 12))
    xm2.place(x=100, y=150)
    cz2 = Entry(root2, font=('Arial', 12))
    cz2.insert(0, 0)
    cz2.place(x=100, y=200)
    xf2 = Entry(root2, font=('Arial', 12))
    xf2.insert(0, 0)
    xf2.place(x=100, y=250)

    # 在图形界面上设定标签
    var2 = StringVar()  # 将label标签的内容设置为字符类型，用var来接收hit_me函数的传出内容用以显示在标签上
    Label(root2, textvariable=var2, bg='LawnGreen', font=('Arial', 12), width=25, height=10).place(x=300, y=100)

    # 给各项赋值
    def 新会员():
        global root
        # a1是手机号，b1是姓名，c1是充值，d1是消费
        a1, b1, c1, d1 = dh2.get(), xm2.get(), cz2.get(), xf2.get()
        l = [b1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        if a1.isdigit():
            if len(a1) == 11:
                if b1:
                    if a1 in hy:
                        var2.set("")
                        var2.set("已有此会员！")
                    else:
                        if c1.isdigit() and d1.isdigit():
                            # 1余额、2上次充值(c1)、3上次消费(d1)、4赠送金额(e1)、5累计充值(c1)、6累计消费(d1)、7累计赠送(e1)、8充值积分(f1)、9目前积分(f1)
                            c1, d1 = float(c1), float(d1)
                            d1 *= 0.85
                            print(f'd1====={d1}')
                            # e1是赠送金额，f1是积分
                            e1, f1 = 会员福利(c1, cz11, zs11, jf11)
                            l[2] = l[5] = c1
                            l[3] = l[6] = d1
                            l[4] = l[7] = e1
                            l[8] = l[9] = f1
                            yv_e = c1 + e1 - d1
                            l[1] = f'{yv_e:.1f}'
                            # print(f'ye===={l[1]}')
                            var2.set("")
                            var2.set(f'{a1}：\n'
                                     f'姓名：{l[0]}\n'
                                     f'余额: {l[1]}元\n'
                                     f'充值:{l[2]}元\n'
                                     f'消费:{l[3]}元\n')
                                     # f'赠送:{l[4]}元\n'
                                     # f'积分:{l[8]}分')
                            hy[a1] = l
                            l = []
                            for i in hy:
                                l.append(i)
                                for j in hy[i]:
                                    l.append(f' \t{str(j)}')
                                l.append('\n')
                            # 开始写入文件
                            with open('子时会员.txt', 'w', encoding='utf8') as f:
                                f.writelines(l)
                            Label(root, text=f'现在有{len(hy)}位会员', bg='OrangeRed', font=('Arial', 20)).place(x=201, y=44)
                        else:
                            var2.set("")
                            var2.set("金额输入错误！请输入整数！")
                else:
                    var2.set("")
                    var2.set("请输入姓名！！！")
            else:
                var2.set("")
                var2.set("手机号位数输入错误！！！")

        else:
            var2.set("")
            var2.set("输入的不是手机号！！！")

    确定添加 = Button(root2, text="确定添加", width=10, command=新会员)
    确定添加.place(x=30, y=300)

def 主程序():
    global root0, hy, root
    root0.destroy()
    root = Tk()  # 创建主窗口
    root.title('会员系统')  # 窗口标题
    root.geometry('600x200+450+100')  # 600宽度，400高度，x,y坐标（左上角为0，用来调整窗口在屏幕的显示位置）
    Label(root, text='欢迎使用子时会员系统', bg='chocolate', font=('Arial', 25)).pack()
    Label(root, text=f'现在有{len(hy)}位会员', bg='OrangeRed', font=('Arial', 20)).pack()

    # 查看按钮位置和大小
    查看按钮 = Button(root, text='查看会员', bg='Green', font=('Arial', 20), command=查看)
    查看按钮.place(x=20, y=100)

    # 查找按钮位置和大小
    查找按钮 = Button(root, text='查找会员', bg='LawnGreen', font=('Arial', 20), command=查找)
    查找按钮.place(x=240, y=100)

    # 添加按钮位置和大小
    添加按钮 = Button(root, text='添加会员', bg='LawnGreen', font=('Arial', 20), command=添加)
    添加按钮.place(x=450, y=100)

    # 会员设置按钮位置和大小
    # 会员设置按钮 = Button(root, text='会员设置', bg='Tan', font=('Arial', 10), command=会员设置)
    # 会员设置按钮.place(x=500, y=50)

def 判断密码():
    if z == 1:
        a, b = e2.get(), e3.get()
        if a and b:
            if a == b:
                v1.set('')
                v1.set('输入正确')
                with open('mm.txt', 'w', encoding='utf8') as f:
                    f.write(a)
                主程序()
            else:
                v1.set('')
                v1.set('密码不一致')
        else:
            v1.set('')
            v1.set('密码不能为空')
    else:
        b = e1.get()
        if b:
            if b == mm:
                v1.set('')
                v1.set('密码正确')
                主程序()
            else:
                v1.set('')
                v1.set('密码不对')
        else:
            v1.set('')
            v1.set('密码不能为空')

# 更改密码函数
def 更改密码():
    global z1, z2, z3
    a, b, c = z1.get(), z2.get(), z3.get()
    if a:
        if a == mm:
            if b and c:
                if a != b:
                    if c == b:
                        with open('mm.txt', 'w', encoding='utf8') as f:
                            f.write(c)
                        v1.set('')
                        v1.set('更改密码成功')
                        主程序()
                    else:
                        v1.set('')
                        v1.set('两次密码不一致')
                else:
                    v1.set('')
                    v1.set('不能和原密码一样')
            else:
                v1.set('')
                v1.set('新密码不能为空')
        else:
            v1.set('')
            v1.set('旧密码输入错误')

def 引导():
    global z1, z2, z3
    Label(root0, text="请输入旧密码：").place(x=10, y=30)
    Label(root0, text="请输入新密码：").place(x=10, y=60)
    Label(root0, text="再次输入密码：").place(x=10, y=90)
    z1 = Entry(root0, show="*")  # show里可以是别的符号
    z1.place(x=120, y=30)
    z2 = Entry(root0, show="*")  # show里可以是别的符号
    z2.place(x=120, y=60)
    z3 = Entry(root0, show="*")  # show里可以是别的符号
    z3.place(x=120, y=90)
    theButton3.place(x=20, y=120)
    theButton4.place(x=180, y=120)
    更改密码()

theButton1 = Button(root0, text="确认", width=10, command=判断密码)
theButton2 = Button(root0, text="更改密码", width=10, command=引导)
theButton3 = Button(root0, bg='OrangeRed', text="确认", width=10, command=更改密码)
theButton4 = Button(root0, bg='OrangeRed', text="退出", width=10, command=root0.quit)
theButton1.place(x=20, y=120)

if z == 0:
    theButton2.place(x=180, y=120)

root0.mainloop()